package com.atguigu.gmall.product.biz.impl;

import com.atguigu.gmall.common.util.Jsons;
import com.atguigu.gmall.product.biz.CategoryBziService;
import com.atguigu.gmall.product.entity.CategoryViewEntity;
import com.atguigu.gmall.product.mapper.BaseCategory1Mapper;
import com.atguigu.gmall.web.CategoryVo;
import com.fasterxml.jackson.core.type.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

/**
 * ClassName: CategoryBziServiceImpl
 * Package: com.atguigu.gmall.product.biz.impl
 * Description:
 *
 * @Author ltystart
 * @Create 2025/8/24 10:11
 * @Version 1.0
 */
@Slf4j
@Service
public class CategoryBziServiceImpl implements CategoryBziService {
    @Autowired
    private BaseCategory1Mapper baseCategory1Mapper;



    /**
     * 缓存:任意一个容器类
     */
    private Map<String, Object> cache = new ConcurrentHashMap();

    @Autowired
    private StringRedisTemplate redisTemplate;


    /**
     * 数据库查询所有分类，封装成一个嵌套的树形结构
     *  本地缓存
     * @return
     */
//    @Override
//    public List<CategoryVo> getCategorysTree() {
//        //1.先看缓存
//        Object categorys = cache.get("categorys");
//        if (categorys == null){
//            //2.缓存中没有，查询数据库
//            List<CategoryVo> vos = baseCategory1Mapper.getCategorysTree();
//            //3.放回缓存
//            cache.put("categorys",vos);
//            return vos;
//        }
//        //4.缓存中有，直接返回
//        List<CategoryVo> vos = (List<CategoryVo>) categorys;
//        return vos;
//    }

    /**
     * 数据库查询所有分类，封装成一个嵌套的树形结构
     * 分布式redis缓存
     *
     * @return
     */
    @Override
    public List<CategoryVo> getCategorysTree() {
        //1.先看缓存
        String categorys = redisTemplate.opsForValue().get("categorys");
        //这里有可能拿到的就是x
//        if ("x".equals(categorys)) {
//            //以前有人查过，但是数据库无此记录
//            return null;
//        }
        if (StringUtils.isEmpty(categorys)) {
            //2.缓存中没有
            //回源：缓存中没有，需要回到数据的源头进行查询
            List<CategoryVo> vos = baseCategory1Mapper.getCategorysTree();
            //3.放入缓存
            if (vos == null) {
                //4.防止缓存穿透。即使数据库没有此数据，缓存一个x，给个短一点的过期时间
                redisTemplate.opsForValue().set("categorys", "x", 60, TimeUnit.MINUTES);
            } else {
                //5.有数据存真实数据
                redisTemplate.opsForValue().set("categorys", Jsons.toStr(vos));
            }
            return vos;
        }
        //4.缓存中有，直接返回
        List<CategoryVo> categoryVos = Jsons.toObj(categorys, new TypeReference<List<CategoryVo>>() {
        });
        return categoryVos;
    }
//    /**
//     * 数据库查询所有分类，封装成一个嵌套的树形结构
//     *  分布式缓存
//     * @return
//     */
//    @Override
//    public List<CategoryVo> getCategorysTree() {
//        List<CategoryVo> vos = baseCategory1Mapper.getCategorysTree();
//        return vos;
//    }

    /**
     * 根据sku的三级分类id，查询分类完整路径信息
     *
     * @param category3Id
     * @return
     */
    @Override
    public CategoryViewEntity getCategoryView(Long category3Id) {
        return baseCategory1Mapper.getCategoryView(category3Id);
    }
}
